﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using GrammarGenericSolver.Model;

namespace GrammarGenericSolver.ADS
{
    /// <summary>
    /// Nó da árvore de derivação, diretamente ou indiretamente ligada à raíz.
    /// </summary>
    public class Node : VirtualNode
    {
        private static Node _nodeFinal;
        /// <summary>
        /// Variável estática e singleton que representa um nó final.
        /// </summary>
        public static Node NodeFinal
        {
            get {
                if (_nodeFinal == null)
                {
                    _nodeFinal = new Node("final", null);
                    _nodeFinal.IsFinal = true;
                }
                return Node._nodeFinal; 
            }
        }
        
        private bool _isFinal;

        /// <summary>
        /// Indica se o nó é final ou não. Por default, não é.
        /// </summary>
        public bool IsFinal
        {
            get { return _isFinal; }
            set { _isFinal = value; }
        }

        private VirtualNode _next;

        /// <summary>
        /// Nó seguinte ao nó atual, no sentido de sequência, exemplo:
        /// <A> ::= <B><C>
        /// </summary>
        public VirtualNode Next
        {
            get { return _next; }
            set { _next = value; }
        }

        private Dictionary<string, VirtualNode> _nodes;

        /// <summary>
        /// Nós filhos ao nó atual. A chave é o identificador do nó (na classe VirtualNode).
        /// </summary>
        public Dictionary<string, VirtualNode> Nodes
        {
            get { return _nodes; }
            set { _nodes = value; }
        }

        public Node(string Identifier, Symbol symbol)
            : base(Identifier, symbol)
        {

        }
    }
}
